#ifndef _W25Q128_H_
#define _W25Q128_H_

// W25Q128容量定义
#define W25Q128_FLASH_SIZE 0x1000000 // 16MB = 16,777,216字节
#define W25Q128_SECTOR_SIZE 0x1000   // 4KB
#define W25Q128_BLOCK_SIZE 0x10000   // 64KB
#define W25Q128_PAGE_SIZE 0x100      // 256字节

// W25Q128指令集
#define W25Q128_CMD_WRITE_ENABLE 0x06
#define W25Q128_CMD_WRITE_DISABLE 0x04
#define W25Q128_CMD_READ_STATUS1 0x05
#define W25Q128_CMD_READ_STATUS2 0x35
#define W25Q128_CMD_READ_STATUS3 0x15
#define W25Q128_CMD_WRITE_STATUS1 0x01
#define W25Q128_CMD_WRITE_STATUS2 0x31
#define W25Q128_CMD_WRITE_STATUS3 0x11
#define W25Q128_CMD_READ_DATA 0x03
#define W25Q128_CMD_FAST_READ 0x0B
#define W25Q128_CMD_PAGE_PROGRAM 0x02
#define W25Q128_CMD_SECTOR_ERASE 0x20
#define W25Q128_CMD_BLOCK_ERASE_32K 0x52
#define W25Q128_CMD_BLOCK_ERASE_64K 0xD8
#define W25Q128_CMD_CHIP_ERASE 0xC7
#define W25Q128_CMD_POWER_DOWN 0xB9
#define W25Q128_CMD_RELEASE_POWER_DOWN 0xAB
#define W25Q128_CMD_DEVICE_ID 0x90
#define W25Q128_CMD_JEDEC_ID 0x9F
#define W25Q128_CMD_ENABLE_RESET 0x66
#define W25Q128_CMD_RESET 0x99

// 状态寄存器位定义
#define W25Q128_STATUS_BUSY 0x01 // 忙标志位
#define W25Q128_STATUS_WEL 0x02  // 写使能锁存位

void W25Q128_Init();
unsigned char W25Q128_ReadSR(unsigned char Reg);
void W25Q128_WriteSR(unsigned char Reg, unsigned char Sr);
void W25Q128_WriteEnable();
void W25Q128_WriteDisable();
void W25Q128_WaitBusy();
unsigned int W25Q128_ReadID();
void W25Q128_UniqueID(unsigned char *ID);
void W25Q128_PowerDown();
void W25Q128_WakeUp();
void W25Q128_EraseSector(unsigned int Sector);
void W25Q128_EraseBlock32K(unsigned int Block);
void W25Q128_EraseBlock64K(unsigned int Block);
void W25Q128_ReadData(unsigned int Address, unsigned char *Data, unsigned int Length);
void W25Q128_WritePage(unsigned int Address, unsigned char *Data, unsigned int Length);
void W25Q128_WriteData(unsigned int Address, unsigned char *Data, unsigned int Length);
bit W25Q128_VerifyErase(unsigned int Sector);
void W25Q128_EnhancedWriteData(unsigned int Address, unsigned char *Data, unsigned int Length);
void W25Q128_CheckAndDisableWriteProtect(void);
bit W25Q128_WriteAndVerify(unsigned int Address, unsigned char *Data, unsigned int Length);
#endif